package co.gov.medellin.ssti.sub.model.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import co.gov.medellin.ssti.sub.common.ConexionFactory;
import co.gov.medellin.ssti.sub.common.excepcion.SUBException;
import co.gov.medellin.ssti.sub.model.dao.ISubprogramaDAO;

import com.cs.beneficios.business.model.AtributoVO;
import com.cs.beneficios.business.model.SubProgramaVO;

public class SubprogramaDAOImpl extends BaseDAOImpl implements ISubprogramaDAO {

	// **************************************
	// QUERYS
	// **************************************

	private static final String SELECT_TODOS_SUBPROGRAMAS = "SELECT DISTINCT CODIGO, NOMBRE, DESCRIPCION, DIAS_REUTILIZAR, "
			+ "GRUPO_FAMILIAR, VALIDAR_CONTRA_ESTUD,  VALIDAR_CONTRA_SISBEN, "
			+ "DIRECCION_BEN_OBLIGATORIA, nvl(VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, "
			+ "DESDE_VIGENCIA, HASTA_VIGENCIA, VIGENCIA,COD_PROGRAMA, NOM_PROGRAMA, COD_CATEGORIA, "
			+ "NOM_CATEGORIA, COD_AREA FROM VCS_BEN_SUBPROG_ALLOWED "
			+ "WHERE VIGENCIA = 'A' ORDER BY NOMBRE ";

	private static final String SELECT_BY_PROGRAMA = "SELECT DISTINCT CODIGO, NOMBRE, DESCRIPCION, DIAS_REUTILIZAR, "
			+ "GRUPO_FAMILIAR, VALIDAR_CONTRA_ESTUD,  VALIDAR_CONTRA_SISBEN, "
			+ "DIRECCION_BEN_OBLIGATORIA, nvl(VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, "
			+ "DESDE_VIGENCIA, HASTA_VIGENCIA, VIGENCIA,COD_PROGRAMA, NOM_PROGRAMA, COD_CATEGORIA, "
			+ "NOM_CATEGORIA, COD_AREA FROM VCS_BEN_SUBPROG_ALLOWED "
			+ "WHERE VIGENCIA = 'A' AND COD_PROGRAMA = ? ORDER BY NOMBRE ";

	private static final String SELECT_GESTOR = "SELECT CODIGO, TIPO_ATRIBUTO, NOMBRE, REST_CODIGO, ORDEN, LONGITUD, "
			+ "OBLIGATORIO, ETIQUETA, VALOR_SUGERIDO, VALIDAR_LISTA, VIGENCIA, "
			+ "TTVF_CODIGO_DOMINIO, DESCRIPCION, TIPO_DATO FROM TCS_BEN_SUBP_ATR_BENEFICIARIO "
			+ "WHERE UPPER(TRIM(NOMBRE)) = 'GESTOR' AND SBPR_CODIGO = ? ";

	/**
	 * 
	 * @return
	 */
	public List loadAllSubprogramas() {
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		List subprogramas = new ArrayList();

		try {
			con = ConexionFactory.getInstance().getConnection();
			pstmt = con.prepareStatement(SELECT_TODOS_SUBPROGRAMAS);
			rst = pstmt.executeQuery();
			while (rst.next()) {
				SubProgramaVO subprograma = new SubProgramaVO();
				;
				subprograma.setCode(new Long(rst.getLong("CODIGO")));
				subprograma.setNombre(rst.getString("NOMBRE"));
				subprogramas.add(subprograma);
			}
		} catch (SQLException e) {
			SUBException
					.logDebugError(
							"Error inesperado obteniendo la lista de todas los subprogramas.",
							e);
		} finally {
			close(con, pstmt, rst);
		}
		return subprogramas;
	}

	/**
	 * 
	 * @return
	 */
	public List loadAllSubprogramasByPrograma(String programaCode) {
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		List subprogramas = new ArrayList();

		try {
			con = ConexionFactory.getInstance().getConnection();
			pstmt = con.prepareStatement(SELECT_BY_PROGRAMA);
			pstmt.setString(1, programaCode);
			rst = pstmt.executeQuery();
			while (rst.next()) {
				SubProgramaVO subprograma = new SubProgramaVO();
				subprograma.setCode(new Long(rst.getLong("CODIGO")));
				subprograma.setNombre(rst.getString("NOMBRE"));
				subprogramas.add(subprograma);
			}
		} catch (SQLException e) {
			SUBException
					.logDebugError(
							"Error inesperado obteniendo la lista de todas los subprogramas por programa.",
							e);
		} finally {
			close(con, pstmt, rst);
		}
		return subprogramas;
	}

	public AtributoVO getGestor(String codeSubprograma) {
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		AtributoVO gestor = null;

		try {
			con = ConexionFactory.getInstance().getConnection();
			pstmt = con.prepareStatement(SELECT_GESTOR);
			pstmt.setString(1, codeSubprograma);
			rst = pstmt.executeQuery();
			if (rst.next()) {
				gestor = new AtributoVO();
				gestor.setCodigo(rst.getString("CODIGO"));
				gestor.setCodatributo(rst.getString("CODIGO"));
				gestor.setValorsugerido(rst.getString("VALOR_SUGERIDO"));
				gestor.setTipovalorflex(rst.getString("TTVF_CODIGO_DOMINIO"));

				String strdominio = rst.getString("VALIDAR_LISTA");
				if (strdominio.equals("S")) {
//					gestor.setValoresflexibles(llenarLista(atr));
//					gestor.setDesvalorsugerido(getDesVFL(atr));
				}

			}
		} catch (SQLException e) {
			SUBException
					.logDebugError(
							"Error inesperado obteniendo la lista de todas los subprogramas por programa.",
							e);
		} finally {
			close(con, pstmt, rst);
		}
		return gestor;

	}

}
